{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-02-18T02:59:03.631669Z",
     "start_time": "2025-02-18T02:58:58.791329Z"
    }
   },
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.cluster import KMeans\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import silhouette_score"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T02:59:08.576064Z",
     "start_time": "2025-02-18T02:59:03.631669Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 读取四张表的数据\n",
    "#读取了订单和产品id的关联，csv比较大\n",
    "prior = pd.read_csv(\"../data/instacart/order_products__prior.csv\")"
   ],
   "id": "1694b88256698bb2",
   "outputs": [],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T02:59:08.627752Z",
     "start_time": "2025-02-18T02:59:08.576064Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#产品id，与过道的对应\n",
    "products = pd.read_csv(\"../data/instacart/products.csv\")"
   ],
   "id": "32a97f71f7ba4db7",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T02:59:09.622414Z",
     "start_time": "2025-02-18T02:59:08.627752Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#订单id和用户id的对应，csv比较大\n",
    "orders = pd.read_csv(\"../data/instacart/orders.csv\")"
   ],
   "id": "20d5f6f566c10b6c",
   "outputs": [],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T02:59:09.635936Z",
     "start_time": "2025-02-18T02:59:09.622414Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#超市的过道，过道放的产品的品类\n",
    "aisles = pd.read_csv(\"../data/instacart/aisles.csv\")"
   ],
   "id": "89df5cfce463b361",
   "outputs": [],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T02:59:09.647424Z",
     "start_time": "2025-02-18T02:59:09.635936Z"
    }
   },
   "cell_type": "code",
   "source": "prior.head()  #订单id，产品id，下面只需要掌握订单和产品的关联即可",
   "id": "497c382acca2e6a8",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   order_id  product_id  add_to_cart_order  reordered\n",
       "0         2       33120                  1          1\n",
       "1         2       28985                  2          1\n",
       "2         2        9327                  3          0\n",
       "3         2       45918                  4          1\n",
       "4         2       30035                  5          0"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>order_id</th>\n",
       "      <th>product_id</th>\n",
       "      <th>add_to_cart_order</th>\n",
       "      <th>reordered</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>33120</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>28985</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>9327</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>45918</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2</td>\n",
       "      <td>30035</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T02:59:33.071595Z",
     "start_time": "2025-02-18T02:59:09.647424Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 合并四张表到一张表  （用户-物品类别），在这里挂了，用下阿里云\n",
    "#订单表和产品表关联\n",
    "#用户买了哪些订单，订单里面有哪些产品，产品对应的过道，过道对应的产品类别\n",
    "_ = pd.merge(prior, products, on=['product_id', 'product_id'])\n",
    "_mg = pd.merge(_, orders, on=['order_id', 'order_id'])\n",
    "mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])"
   ],
   "id": "be91e352cb329421",
   "outputs": [],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.271662Z",
     "start_time": "2025-02-18T02:59:33.086479Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 交叉表（特殊的分组工具），如果在这一步内存不够了，重启一下jupyter，还是不行，筛选一部分用户的数据，进行聚类\n",
    "cross = pd.crosstab(mt['user_id'], mt['aisle'])\n",
    "cross.head(10)"
   ],
   "id": "6eceb7d057338fe9",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "aisle    air fresheners candles  asian foods  baby accessories  \\\n",
       "user_id                                                          \n",
       "1                             0            0                 0   \n",
       "2                             0            3                 0   \n",
       "3                             0            0                 0   \n",
       "4                             0            0                 0   \n",
       "5                             0            2                 0   \n",
       "6                             0            0                 0   \n",
       "7                             0            0                 0   \n",
       "8                             0            1                 0   \n",
       "9                             0            0                 0   \n",
       "10                            0            1                 0   \n",
       "\n",
       "aisle    baby bath body care  baby food formula  bakery desserts  \\\n",
       "user_id                                                            \n",
       "1                          0                  0                0   \n",
       "2                          0                  0                0   \n",
       "3                          0                  0                0   \n",
       "4                          0                  0                0   \n",
       "5                          0                  0                0   \n",
       "6                          0                  0                0   \n",
       "7                          0                  0                0   \n",
       "8                          0                  0                0   \n",
       "9                          0                  6                0   \n",
       "10                         0                  0                0   \n",
       "\n",
       "aisle    baking ingredients  baking supplies decor  beauty  beers coolers  \\\n",
       "user_id                                                                     \n",
       "1                         0                      0       0              0   \n",
       "2                         2                      0       0              0   \n",
       "3                         0                      0       0              0   \n",
       "4                         0                      0       0              0   \n",
       "5                         0                      0       0              0   \n",
       "6                         0                      0       0              0   \n",
       "7                         2                      0       0              0   \n",
       "8                         1                      0       0              0   \n",
       "9                         2                      0       0              0   \n",
       "10                        0                      0       0              0   \n",
       "\n",
       "aisle    ...  spreads  tea  tofu meat alternatives  tortillas flat bread  \\\n",
       "user_id  ...                                                               \n",
       "1        ...        1    0                       0                     0   \n",
       "2        ...        3    1                       1                     0   \n",
       "3        ...        4    1                       0                     0   \n",
       "4        ...        0    0                       0                     1   \n",
       "5        ...        0    0                       0                     0   \n",
       "6        ...        0    0                       0                     0   \n",
       "7        ...        0    0                       0                     0   \n",
       "8        ...        0    0                       0                     0   \n",
       "9        ...        0    0                       0                     0   \n",
       "10       ...        0    0                       0                     0   \n",
       "\n",
       "aisle    trail mix snack mix  trash bags liners  vitamins supplements  \\\n",
       "user_id                                                                 \n",
       "1                          0                  0                     0   \n",
       "2                          0                  0                     0   \n",
       "3                          0                  0                     0   \n",
       "4                          0                  0                     0   \n",
       "5                          0                  0                     0   \n",
       "6                          0                  0                     0   \n",
       "7                          0                  0                     0   \n",
       "8                          0                  0                     0   \n",
       "9                          0                  0                     0   \n",
       "10                         0                  0                     0   \n",
       "\n",
       "aisle    water seltzer sparkling water  white wines  yogurt  \n",
       "user_id                                                      \n",
       "1                                    0            0       1  \n",
       "2                                    2            0      42  \n",
       "3                                    2            0       0  \n",
       "4                                    1            0       0  \n",
       "5                                    0            0       3  \n",
       "6                                    0            0       0  \n",
       "7                                    0            0       5  \n",
       "8                                    0            0       0  \n",
       "9                                    2            0      19  \n",
       "10                                   0            0       2  \n",
       "\n",
       "[10 rows x 134 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>aisle</th>\n",
       "      <th>air fresheners candles</th>\n",
       "      <th>asian foods</th>\n",
       "      <th>baby accessories</th>\n",
       "      <th>baby bath body care</th>\n",
       "      <th>baby food formula</th>\n",
       "      <th>bakery desserts</th>\n",
       "      <th>baking ingredients</th>\n",
       "      <th>baking supplies decor</th>\n",
       "      <th>beauty</th>\n",
       "      <th>beers coolers</th>\n",
       "      <th>...</th>\n",
       "      <th>spreads</th>\n",
       "      <th>tea</th>\n",
       "      <th>tofu meat alternatives</th>\n",
       "      <th>tortillas flat bread</th>\n",
       "      <th>trail mix snack mix</th>\n",
       "      <th>trash bags liners</th>\n",
       "      <th>vitamins supplements</th>\n",
       "      <th>water seltzer sparkling water</th>\n",
       "      <th>white wines</th>\n",
       "      <th>yogurt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>user_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>42</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 134 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.275709Z",
     "start_time": "2025-02-18T03:00:27.271662Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 进行主成分分析,那么大家还记得不？，保留90%的成分，实际特征数目减少了几倍，134--》27\n",
    "pca = PCA(n_components=0.9)\n"
   ],
   "id": "6d284ddbcd0c12bf",
   "outputs": [],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.491447Z",
     "start_time": "2025-02-18T03:00:27.275709Z"
    }
   },
   "cell_type": "code",
   "source": [
    "data = pca.fit_transform(cross)  #还记得fit_transform的作用不？\n",
    "data.shape"
   ],
   "id": "5f0a04bb8a0a40bd",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(206209, 27)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.496310Z",
     "start_time": "2025-02-18T03:00:27.491447Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 把样本数量减少,为了下面画图方便，这里只取500个样本\n",
    "x = data[:500]\n",
    "x.shape"
   ],
   "id": "6b7abd51584da640",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(500, 27)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.500Z",
     "start_time": "2025-02-18T03:00:27.496310Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 假设用户一共分为四个类别\n",
    "#n_clusters是分为几个类别，是主要的超参\n",
    "km = KMeans(n_clusters=4)"
   ],
   "id": "aa0994a52f7cafdd",
   "outputs": [],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.784692Z",
     "start_time": "2025-02-18T03:00:27.500Z"
    }
   },
   "cell_type": "code",
   "source": "km.fit(x)  #开始训练",
   "id": "86dfbd7f2575ec5b",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\75713\\venv\\Lib\\site-packages\\joblib\\externals\\loky\\backend\\context.py:136: UserWarning: Could not find the number of physical cores for the following reason:\n",
      "[WinError 2] 系统找不到指定的文件。\n",
      "Returning the number of logical cores instead. You can silence this warning by setting LOKY_MAX_CPU_COUNT to the number of cores you want to use.\n",
      "  warnings.warn(\n",
      "  File \"C:\\Users\\75713\\venv\\Lib\\site-packages\\joblib\\externals\\loky\\backend\\context.py\", line 257, in _count_physical_cores\n",
      "    cpu_info = subprocess.run(\n",
      "               ^^^^^^^^^^^^^^^\n",
      "  File \"C:\\Program Files\\Python312\\Lib\\subprocess.py\", line 548, in run\n",
      "    with Popen(*popenargs, **kwargs) as process:\n",
      "         ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"C:\\Program Files\\Python312\\Lib\\subprocess.py\", line 1026, in __init__\n",
      "    self._execute_child(args, executable, preexec_fn, close_fds,\n",
      "  File \"C:\\Program Files\\Python312\\Lib\\subprocess.py\", line 1538, in _execute_child\n",
      "    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,\n",
      "                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "KMeans(n_clusters=4)"
      ],
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KMeans(n_clusters=4)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>KMeans</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.cluster.KMeans.html\">?<span>Documentation for KMeans</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>KMeans(n_clusters=4)</pre></div> </div></div></div></div>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.795289Z",
     "start_time": "2025-02-18T03:00:27.789188Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#开始预测\n",
    "predict = km.predict(x)"
   ],
   "id": "f0809088242481e0",
   "outputs": [],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.800909Z",
     "start_time": "2025-02-18T03:00:27.795289Z"
    }
   },
   "cell_type": "code",
   "source": "print(predict)  #预测得到的是每一个样本的类别",
   "id": "c0cad1c75e8ee976",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0\n",
      " 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 0 0 2 0 0\n",
      " 0 0 0 3 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 3 1 0 0 0 2 0 0 0 0 0 0 0 0\n",
      " 3 0 0 0 2 0 0 0 0 2 2 2 0 2 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 0 0 0 0 0 0 0 2 3 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 2 0 3 0 0 0 2 0 0 0 0 0 0\n",
      " 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0\n",
      " 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1\n",
      " 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 0 2 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2\n",
      " 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0]\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.807728Z",
     "start_time": "2025-02-18T03:00:27.801198Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import numpy as np\n",
    "np.unique(predict)"
   ],
   "id": "6a72cc8cf2a158d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3], dtype=int32)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:27.986263Z",
     "start_time": "2025-02-18T03:00:27.807728Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 显示聚类的结果\n",
    "plt.figure(figsize=(20, 20))"
   ],
   "id": "9318e2895f2c09db",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 2000x2000 with 0 Axes>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 2000x2000 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:28.146121Z",
     "start_time": "2025-02-18T03:00:27.987270Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 建立四个颜色的列表\n",
    "colored = ['orange', 'green', 'blue', 'purple']\n",
    "colr = [colored[i] for i in predict] #根据类别给每个样本赋予颜色\n",
    "#去选择任意两个特征来看聚类的图，可以自行调整,第2个，第20个特征\n",
    "plt.scatter(x[:, 1], x[:, 19], color=colr)\n"
   ],
   "id": "f829dbd4b6a58f4",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x12845258860>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-18T03:00:28.155884Z",
     "start_time": "2025-02-18T03:00:28.146121Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 评判聚类效果，轮廓系数，聚类效果很难超过0.7，可以通过这个得分去调整上面KMeans的n_clusters\n",
    "silhouette_score(x, predict)"
   ],
   "id": "ab308877d35d4653",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(0.6519828361081939)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
